#include "log.hpp"
#include "Data_Man.hpp"
#include "FileUtil.hpp"
#include <time.h>
#include <unistd.h>
extern cloud::DataManager* data;
namespace cloud
{
    class Hot_Manager
    {
    private:
        bool Judge_Is_Hot(const std::string &filename) // 热点文件返回1，非热点文件返回0
        {
            cloud::Config *conf = cloud::Config::Getinstance(); // 拿到配置文件的操作句柄
            cloud::FileUtil fu(filename);
            time_t LastAcctime = fu.LastATime();
            time_t Curtime = time(nullptr);
            if (Curtime - LastAcctime > conf->Get_hot_time()) // 说明是非热点文件
            {
                return false;
            }
            return true;
        }

    public:
        Hot_Manager()
        {
            // 如果备份文件夹不存在 就创建一个
            // 如果压缩包存放路径不存在，就创建一个
            // 如果数据信息存放文件不存在，就创建一个
            cloud::Config *conf = cloud::Config::Getinstance(); // 拿到配置文件的操作句柄
            std::string back_dir = conf->Get_back_dir();
            std::string pack_dir = conf->Get_pack_dir();
            std::string backup_file = conf->Get_backup_file();
            cloud::FileUtil fu1(back_dir);
            if (fu1.Exists() == false)
                fu1.CreateDirectory();
            cloud::FileUtil fu2(pack_dir);
            if (fu2.Exists() == false)
                fu2.CreateDirectory();
        }
        bool RunMoudle()
        {
            while (1)
            {
                // 第一步 遍历备份文件夹，拿到所有已经备份的文件
                cloud::Config *conf = cloud::Config::Getinstance(); // 拿到配置文件的操作句柄
                // int hot_time = conf->Get_hot_time();
                // std::string backup_file = conf->Get_backup_file();
                std::string back_dir = conf->Get_back_dir();
                // std::string pack_dir = conf->Get_pack_dir();
                cloud::FileUtil fu(back_dir); // 实例化备份文件的操作工具类
                std::vector<std::string> arr;
                fu.ScanDirectory(&arr);
                for (auto iter : arr)
                {

                    if (Judge_Is_Hot(iter)) // 如果判断为热点文件，则不做任何操作
                    {
                        continue;
                    }
                    cloud::Backupinfo bi;
                    if (data->GetOneByRealpath(iter, &bi) == false)
                    {
                        bi.NewBackupinfo(iter);
                    }
                    // 走到这说明是非热点文件,那么就压缩这个文件,放进压缩包存放路径
                    cloud::FileUtil com(bi._real_path);
                    com.Compress(bi._pack_path); // 压缩完直接就写入了
                    com.Remove();                // 删除源文件
                    bi._pack_flag = true;
                    data->Update(bi);
                }
                // 判断是否是热点文件
                // 如果是非热点文件，就压缩并存放进压缩包存放路径，删除源文件,修改备份信息
                usleep(10000);
            }
            return true;
        }

    private:
    };
}